/// Flutter 日期时间工具类
/// 功能全面，适用于常见的日期、时间格式化与处理
import 'package:intl/intl.dart';

class utilDateTime {
  /// 获取当前时间
  static DateTime now() => DateTime.now();

  /// 获取当前时间的时间戳（毫秒）
  static int currentTimestamp() => DateTime.now().millisecondsSinceEpoch;

  /// 将时间戳（毫秒）转换为 DateTime
  static DateTime fromTimestamp(int timestamp) =>
      DateTime.fromMillisecondsSinceEpoch(timestamp);

  /// 将 DateTime 转为时间戳（毫秒）
  static int toTimestamp(DateTime dateTime) => dateTime.millisecondsSinceEpoch;

  /// 格式化时间为指定格式，默认 yyyy-MM-dd HH:mm:ss
  static String format(
    DateTime dateTime, {
    String pattern = 'yyyy-MM-dd HH:mm:ss',
  }) {
    return DateFormat(pattern).format(dateTime);
  }

  /// 将字符串转为 DateTime，指定格式（默认 yyyy-MM-dd HH:mm:ss）
  static DateTime? parse(
    String dateStr, {
    String pattern = 'yyyy-MM-dd HH:mm:ss',
  }) {
    try {
      return DateFormat(pattern).parse(dateStr);
    } catch (_) {
      return null;
    }
  }

  /// 判断两个时间是否是同一天
  static bool isSameDay(DateTime a, DateTime b) {
    return a.year == b.year && a.month == b.month && a.day == b.day;
  }

  /// 判断是否是今天
  static bool isToday(DateTime dateTime) {
    final now = DateTime.now();
    return isSameDay(now, dateTime);
  }

  /// 判断是否是昨天
  static bool isYesterday(DateTime dateTime) {
    final yesterday = DateTime.now().subtract(const Duration(days: 1));
    return isSameDay(dateTime, yesterday);
  }

  /// 获取星期几（中文）
  static String getWeekdayZh(DateTime dateTime) {
    const weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'];
    return weekdays[dateTime.weekday - 1];
  }

  /// 获取星期几（英文）
  static String getWeekdayEn(DateTime dateTime) {
    return DateFormat('EEEE').format(dateTime);
  }

  /// 获取两个时间之间的差值（单位：天）
  static int diffInDays(DateTime start, DateTime end) {
    return end.difference(start).inDays;
  }

  /// 获取两个时间之间的差值（单位：小时）
  static int diffInHours(DateTime start, DateTime end) {
    return end.difference(start).inHours;
  }

  /// 获取两个时间之间的差值（单位：分钟）
  static int diffInMinutes(DateTime start, DateTime end) {
    return end.difference(start).inMinutes;
  }

  /// 增加指定天数
  static DateTime addDays(DateTime dateTime, int days) {
    return dateTime.add(Duration(days: days));
  }

  /// 增加指定小时
  static DateTime addHours(DateTime dateTime, int hours) {
    return dateTime.add(Duration(hours: hours));
  }

  /// 增加指定分钟
  static DateTime addMinutes(DateTime dateTime, int minutes) {
    return dateTime.add(Duration(minutes: minutes));
  }

  /// 获取某日期当天的开始时间（00:00:00）
  static DateTime startOfDay(DateTime dateTime) {
    return DateTime(dateTime.year, dateTime.month, dateTime.day);
  }

  /// 获取某日期当天的结束时间（23:59:59）
  static DateTime endOfDay(DateTime dateTime) {
    return DateTime(dateTime.year, dateTime.month, dateTime.day, 23, 59, 59);
  }

  /// 判断是否是闰年
  static bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
  }

  /// 获取某个月的天数
  static int daysInMonth(int year, int month) {
    final firstDayThisMonth = DateTime(year, month, 1);
    final firstDayNextMonth = DateTime(year, month + 1, 1);
    return firstDayNextMonth.difference(firstDayThisMonth).inDays;
  }

  /// 比较两个时间是否相等（忽略毫秒）
  static bool isSameMoment(DateTime a, DateTime b) {
    return a.difference(b).inSeconds == 0;
  }

  /// 获取当前年份
  static int currentYear() => DateTime.now().year;

  /// 获取当前月份
  static int currentMonth() => DateTime.now().month;

  /// 获取当前日
  static int currentDay() => DateTime.now().day;
  //获取毫秒
  static String millisecondsSinceEpoch() => DateTime.now().millisecondsSinceEpoch.toString();

}

/*
使用示例：
final now = DateTimeUtil.now();
final timestamp = DateTimeUtil.currentTimestamp();
final formatted = DateTimeUtil.format(now);
final parsed = DateTimeUtil.parse("2024-01-01 12:00:00");
final weekday = DateTimeUtil.getWeekdayZh(now);
*/
